package dbb

import (
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
	"github.com/gogf/gf/v2/database/gdb"
	"github.com/y2h/fyne_poem/widgets"
)

func Tbs(db gdb.DB, tbl string,
	msg *widget.Label, w fyne.Window, a fyne.App) fyne.CanvasObject {
	jgo := container.NewTabItem("结构",
		// Field2(db, tbl))
		Field(db, tbl, msg, w))
	sju := container.NewTabItem("数据",
		TblData(db, tbl, msg, w, a))
	// ysu := container.NewTabItem("约束",
	// 	view(db, msg, w))
	idx := container.NewTabItem("Indexes",
		idx(db, tbl))
	// cfq := container.NewTabItem("触发器",
	// 	trigger(db, msg, w))
	ddl := container.NewTabItem("DDL",
		ddl(db, tbl))
	// apptabs := container.NewAppTabs(jgo, sju, ysu, idx, cfq, ddl)
	apptabs := container.NewAppTabs(jgo, sju, idx, ddl)
	return apptabs
}

var entryddl *widget.Entry

// func setddl(db gdb.DB, tbl string,
// 	msg *widget.Label) {
// 	if entryddl == nil {
// 		entryddl = widget.NewMultiLineEntry()
// 	}
// 	stmt := "SELECT sql FROM sqlite_master WHERE tbl_name = '" +
// 		tbl + "' AND type = 'table'"
// 	// entry.SetText(GetOne(db, stmt, msg))
// 	v, err := db.Raw(stmt).Value()
// 	if err != nil {
// 		msg.SetText(err.Error())
// 		entryddl.SetText(err.Error())
// 	} else {
// 		entryddl.SetText(v.String())
// 	}
// }
// func Ddl(db gdb.DB, tbl string,
// 	msg *widget.Label) fyne.CanvasObject {
// 	if db == nil || tbl == "" {
// 		msg.SetText("please connect to a database")
// 		return nil
// 	}

// 	setddl(db, tbl, msg)
// 	dataBrowser := container.NewTabItemWithIcon("", octicons.NoteIcon(),
// 		widget.NewLabel(""))
// 	dataBrowser.Content = container.NewBorder(nil, nil, nil, nil, entryddl)
// 	dataBrowser.Text = tbl + " Create SQL"
// 	// tabs.Append(dataBrowser)
// 	// tabs.Select(dataBrowser)
// 	return dataBrowser.Content
// }

func trigger(db gdb.DB, msg *widget.Label, w fyne.Window) fyne.CanvasObject {
	idxs, err := db.Model(sqlite_master).Where("type", "trigger").All()
	if err != nil {
		msg.SetText(err.Error())
		return nil
	}
	if idxs.Len() == 0 {
		msg.SetText("no trigger")
		return widget.NewLabel("no trigger in this table")
	}
	// _, cols := SqliteTblColsGF(db, sqlite_master)
	_, cols := TableFields2(db, sqlite_master)
	// h := garray.NewStrArrayFrom(cols)
	// h.RemoveValue("type")
	// h.RemoveValue("rootpage")
	// hd := h.Slice()
	lst := ListResult(db, sqlite_master, headd(idxs), idxs, msg, w)
	return container.NewBorder(widgets.Header(cols, 0), nil, nil, nil, lst)
}
func view(db gdb.DB, msg *widget.Label, w fyne.Window) fyne.CanvasObject {
	idxs, err := db.Model(sqlite_master).Where("type", "view").All()
	if err != nil {
		msg.SetText(err.Error())
		return nil
	}
	if idxs.Len() == 0 {
		msg.SetText("no view")
		return widget.NewLabel("no view in this table")
	}
	// _, cols := SqliteTblColsGF(db, sqlite_master)
	_, cols := TableFields2(db, sqlite_master)
	// h := garray.NewStrArrayFrom(cols)
	// h.RemoveValue("type")
	// h.RemoveValue("rootpage")
	// hd := h.Slice()
	lst := ListResult(db, sqlite_master, headd(idxs), idxs, msg, w)
	return container.NewBorder(widgets.Header(cols, 0), nil, nil, nil, lst)
}

/* https://www.jb51.cc/sqlite/198477.html
// sqlite_master表是sqlite的系统表。该表记录该数据库中保存的表、索引、视图、和触发器信息。每一行记录一个项目。在创建一个sqlIte数据库的时候，该表会自动创建。sqlite_master表包含5列。
// type列记录了项目的类型，如table、index、view、trigger。
// name列记录了项目的名称，如表名、索引名等。
// tbl_name列记录所从属的表名，如索引所在的表名。对于表来说，该列就是表名本身。
// rootpage列记录项目在数据库页中存储的编号。对于视图和触发器，该列值为0或者NULL。
// sql列记录创建该项目的sql语句。
// 由于sqlite_master表存储所有的数据库项目，所以可以通过该表判断特定的表、视图或者索引是否存在。例如，以下语句可以判断user表是否存在。
select count(*) from sqlite_master where name='user' and type='table'
*/

// 返回排好序的表的列名数组
// func tableFields(db gdb.DB, tbl string) *garray.StrArray {
// 	fm, _ := db.TableFields(db.GetCtx(), tbl)
// 	//fm, _ := newDb.Model(sqlite_master).TableFields(sqlite_master)
// 	return garray.NewStrArrayFrom(sortFieldKey(fm))
// }
// func sortFieldKey(fieldMap map[string]*gdb.TableField) []string {
// 	names := make(map[int]string)
// 	for _, field := range fieldMap {
// 		names[field.Index] = field.Name
// 	}
// 	var (
// 		i      = 0
// 		j      = 0
// 		result = make([]string, len(names))
// 	)
// 	for {
// 		if len(names) == 0 {
// 			break
// 		}
// 		if val, ok := names[i]; ok {
// 			result[j] = val
// 			j++
// 			delete(names, i)
// 		}
// 		i++
// 	}
// 	return result
// }
